package com.dongdongshop.shiro;

import com.alibaba.dubbo.config.annotation.Reference;

import com.dongdongshop.pojo.TbPerson;
import com.dongdongshop.service.PersonService;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;

/**
 * 自定义 realm 类   需要继承 AuthenticatingRealm : 只有登录功能
 *                         AuthorizingRealm   :  登录和授权功能
 */
public class LoginRealm extends AuthorizingRealm {

    @Reference
    private PersonService personService;

    @Override                   // 授权方法
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("进入授权方法.......");
        return null;
    }

    @Override                   // 认证方法
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {

        // 执行登录逻辑
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;

        TbPerson person = personService.selectByName(token.getUsername());
        if (person == null){
            throw new UnknownAccountException("账号未注册");
        }

        // MD5 MD4 SHA-1 SHA-2 哈希算法
        // 哈希算法 : 将一个字符串计算出毫无规律的杂凑字符串   特点 : 正向快速  逆向不可逆
        // 对称加密  发送方和接收方 使用同一个秘钥
        // 非对称加密  发送方和接收方 使用两个秘钥   发送用私钥 接收方用公钥
        // RSA (支付宝 微信)  椭圆曲线算法(比特币交易)


        // 第一个参数 : 登录成功后放进session 中的对象,第二个参数 : 数据库查询出来的密码,
        // 第三个参数 : 加密的次数 salt,第四个参数 : 用户账户名
        // 这一步就是 解密
        return new SimpleAuthenticationInfo(person,person.getPwd(), ByteSource.Util.bytes(person.getSalt()),person.getPname());
    }
}
